package com.sojson.project.verifycode.service;

import static com.sojson.constant.ConstantByMap.IMG_PATH;

import java.io.IOException;

import com.sojson.util.verifycode.VerifyCodeUtil.Verify;

/**
 * 验证码Service
 * 
 * @author liu
 * @date 2020-08-05
 */
public interface VerifyCodeService {

    /** 验证码图片基础路径 */
    String VERIFY_IMG = IMG_PATH + "/verifyImg";

    /**
     * 获取验证码
     * 
     * @param verifyCodePrefix 验证码前缀
     * @return
     * @throws IOException 
     */
    Verify getVerifyCode(String verifyCodePrefix) throws IOException;

    /**
     * 获取验证码
     * 
     * @param verifyCodePrefix 验证码前缀
     * @param timeout 验证码超时时间
     * @return
     * @throws IOException 
     */
    Verify getVerifyCode(String verifyCodePrefix, Integer timeout) throws IOException;

    /**
     * 获取邮箱验证码
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param target 目标邮箱
     * @return
     * @throws Exception 
     */
    void getVerifyCodeMail(String verifyCodePrefix, String target) throws Exception;

    /**
     * 获取邮箱验证码
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param target 目标邮箱
     * @param timeout 验证码超时时间
     * @return
     * @throws Exception 
     */
    void getVerifyCodeMail(String verifyCodePrefix, String target, Integer timeout) throws Exception;

    /**
     * 获取短信验证码
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param tel 手机号
     * @return
     * @throws Exception 
     */
    void getVerifyCodeSms(String verifyCodePrefix, String tel) throws Exception;

    /**
     * 获取短信验证码
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param tel 手机号
     * @param timeout 验证码超时时间
     * @return
     * @throws Exception 
     */
    void getVerifyCodeSms(String verifyCodePrefix, String tel, Integer timeout) throws Exception;

    /**
     * 获取验证码图片
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @return
     * @throws Exception
     */
    void getVerifyCodeImage(String verifyCodePrefix) throws Exception;

    /**
     * 获取验证码图片
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param timeout 验证码超时时间
     * @return
     * @throws Exception
     */
    void getVerifyCodeImage(String verifyCodePrefix, Integer timeout) throws Exception;

    /**
     * 获取验证码图片流加密后的字符串
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @return
     * @throws Exception
     */
    String getVerifyCodeImageByteStr(String verifyCodePrefix) throws Exception;

    /**
     * 获取验证码图片流加密后的字符串
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param timeout 验证码超时时间
     * @return
     * @throws Exception
     */
    String getVerifyCodeImageByteStr(String verifyCodePrefix, Integer timeout) throws Exception;

    /**
     * 获取验证码图片在本地目录的路径
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @return
     * @throws Exception
     */
    String getVerifyCodeImageThisLocal(String verifyCodePrefix) throws Exception;

    /**
     * 获取验证码图片在本地目录的路径
     * 
     * @param verifyCodePrefix 验证码前缀,用来区分不同验证码
     * @param timeout 验证码超时时间
     * @return
     * @throws Exception
     */
    String getVerifyCodeImageThisLocal(String verifyCodePrefix, Integer timeout) throws Exception;

    /**
     * 对比并清空验证码
     * 
     * @param verifyCodePrefix 验证码前缀
     * @param code 用户输入的值
     * @return 成功还是失败
     * @throws IOException 
     */
    boolean verifyAndClearCode(String verifyCodePrefix, String code) throws IOException;

}